package com.dc.refactoring._1_重新组织函数._1_ExtractMethod;

import java.util.List;

/**
 * Description: 函数提炼
 * @author: gdc
 * @date: 2020/11/13
 * @version 1.0
 */
class Test1 {

    /**
     * 这样我们就完成了从计算到输出的所有过程
     */
    public void printOwing(String name, List<Double> list) {
        //打印店名
        System.out.println("-------------------------");
        System.out.println("-**********支付*********-");
        System.out.println("-------------------------");

        double outstanding = list.stream().mapToDouble(Double::doubleValue).sum();
        double discount = outstanding * 0.8;

        //打印需要需要支付的价格
        System.out.println("hello Mr/Ms " + name);
        System.out.println("you need to pay $" + discount);
    }
}


class Test2 {
    public void printOwing(String name, List<Double> bill) {
        printBanner();
        printBill(name, getOutStanding(bill));
    }

    /**
     * 打印广告语，这种属于没有局部变量，直接将代码移动进来即可
     */
    public void printBanner() {
        System.out.println("--------------------------");
        System.out.println("-*********XX支付*********-");
        System.out.println("--------------------------");
    }

    /**
     * 打印账单，这是要使用局部变量的，使用参数传递就行
     * 只在调用函数前使用也是这样
     */
    public void printBill(String name, double outstanding) {
        System.out.println("hello Mr/Ms " + name);
        System.out.println("you need to pay $" + outstanding);
    }

    /**
     * 计算价格
     */
    public double getOutStanding(List<Double> bill) {
        return discount(bill.stream().mapToDouble(Double::doubleValue).sum());
    }

    /**
     * 要在调用后使用，就要将值传回去，虽然引用数据类型没有这个烦恼，最好还是返回
     * 一个值，因为尽量不要改变原来的对象，说不定在哪被用之后就会产生错误
     */
    public double discount(double outstanding) {
        return outstanding * 0.8;
    }
}
